<?php
/**
 * analyse de l'url et session pour déterminer la root
 *
 * @author Gmax
 */
class controler_rooter extends controler{
    private $_root;
    
    function __construct() {
        switch(__ESPACE__){
            case 'public':{
                $this->_root = $this->_parseRoot();
                break;
            }
            case 'admin':{
                $this->_root = $this->_parseAdminRoot();
                break;
            }
            default :{
                $this->_root = $this->_parseRoot();
                break;
            }
        }
    }
    
    /**
     * renvoi le tableau de définition de la root
     * @return array
     */
    public function getRoot(){
        return $this->_root;
    }
    
    /**
     * renvoi le tableau de la définition de la root
     * $root = array(
            'hierarchie'=>array(),
            'query'=>'',
            'redirection'=>null,
            '404'=>false
        );
     * @param string $uriString
     * @return array
     */
    private function _parseRoot($uriString = ''){
        /* base default */
        $root = array(
            'hierarchie'=>array(),
            'query'=>'',
            'redirection'=>null,
            '404'=>false
        );
        if(self::getHomePage()!==null){
            $root['target_name'] = self::getHomePageName();
            $root['target'] = self::getHomePage();
        }else{
            $root['target_name'] = self::getOrigineCategoryName();
            $root['target'] = self::getOrigineCategory();
        }
        
        $uri = ($uriString!=='')?$uriString:$_SERVER['REQUEST_URI'];
        
        /* vérifictation de la présence d'un query */
        $query = '';
        if($uri!=='' && strpos($uri, '?')!==false){
            list($url,$query) = explode('?',$uri,2);
        }else{
            $url = $uri;
        }
        $root['query']['data'] = $_REQUEST;
        $root['query']['brut'] = $query;
        
        /* suppression du '/' du début */
        if(substr($url, 0, 1)==='/')$url = substr ($url, 1);
        /* suppression du '/' final */
        if(substr($url, -1)==='/')$url = substr ($url, 0,-1);
                
        /* décomposition de la root */
        $vars = array();
        if(!empty($url)&&$url!==''){
            $vars = explode('/',$url);
            /* analyse root */
            $baseDirectory = self::getBaseDirectory();
            // suppression du '/' du début
            if(substr($baseDirectory, 0, 1)==='/')$baseDirectory = substr ($baseDirectory, 1);
            // suppression du '/' final
            if(substr($baseDirectory, -1)==='/')$baseDirectory = substr ($baseDirectory, 0,-1);
            $base = explode('/', $baseDirectory);
            while(isset($vars[0])&&isset($base[0])&&$vars[0]!==''&&$vars[0]===$base[0]){
                array_shift($vars);
                array_shift($base);
            }
            
            foreach ($vars as $k => $v){
                $target = $this->findTarget($v);
                if($k === (count($vars)-1)){ // target finale
                    $root['target_name'] = $v;
                    if(!$target['404']) $root['target'] = $target['target'];
                    $root['404'] = $target['404'];
                    $root['redirection'] = $target['redirection'];
                }else{
                    if($target['404']&&$target['redirection']!==null){
                        $root['hierarchie'][] = $target['redirection']->getTargetObject();
                    }else{
                        $root['hierarchie'][] = $target['target'];
                    }
                }
            }
        }
        return $root;
    }
    
    private function findTarget($permalien){
        $retour = array(
            'target'=>null,
            '404'=>false,
            'translate'=>false,
            'redirection'=>null
        );
        // recherche target
        $retour['target'] = modele::findByPermalien($permalien,'',false);
        //recherche redirection
        if($retour['target']===null){
            $retour['404'] = true;
            $redirection = new modele_redirection($permalien);
            $retour['redirection'] = ($redirection->getModeleId()>0)?$redirection:null;
        }
        //recherche translate
        if($retour['target']===null&&$retour['redirection']===null){
            $translator = modele_translate::findTranslatorByPermalien($permalien);
            
            if($translator!==null){
                $retour['404'] = false;
                $retour['translate'] = true;
                session::set('lang', $translator->getLangue());
                $retour['target'] = $translator->getTargetObject();
            }
        }else{
            session::delete('lang');
        }
        
        return $retour;
    }
    
    /**
    * renvoi le tableau de la définition de la root
    * $root = array(
    *       'template'=>'',
    *       'action'=>'',
    *       'modele'=>null,
    *       'do'=>false,
    *       'data'=>array()
    *       );
    * @param string $uriString
    * @return array
    */
    private static function _parseAdminRoot(){
        $root = array(
            'target_name'=>'index.php',
            '404'=>false,
            'template'=>'',
            'action'=>'',
            'modele'=>'',
            'module'=>'',
            'do'=>false,
            'data'=>array()
        );
        
        if(isset($_GET)){
            if(isset($_GET['action']) && $_GET['action'] !== '' ){
                $root['action'] = $_GET['action'];
            }
            if(isset($_GET['do'])){
                $root['do'] = $_GET['do']+0;
            }
            if(isset($_GET['modele']) && $_GET['modele'] !== '' ){
                $root['modele'] = $_GET['modele'];
            }
            if(isset($_GET['module']) && $_GET['module'] !== '' ){
                $root['module'] = $_GET['module'];
            }
            if(isset($_GET['modele_id']) && $_GET['modele_id'] !== '' ){
                $root['modele_id'] = $_GET['modele_id'];
            }
            if(isset($_GET['template']) && $_GET['template'] !== '' ){
                $root['template'] = $_GET['template'];
            }
        }
        if(isset($_POST) && count($_POST)>0){
            foreach($_POST as $key=>$val){
                if(substr($key,0,6)==='modele'){
                    $root['data'][substr($key,6)] = $val;
                }
            }
        }        
        return $root;
    }
}